#ifndef ANALYZEBMP_H
#define ANALYZEBMP_H
#include "bytearraylist.h"
#include "data_structure.h"

#define GET_BYTE(vbyte, index) (((vbyte) & (1 << ((index) ^ 7))) != 0)
#define SET_BYTE(vbyte, index) ((vbyte) |= (1 << ((index) ^ 7)))
#define CLR_BYTE(vbyte, index) ((vbyte) &= (~(1 << ((index) ^ 7))))

//#define RESERVED_BYTES 2      //弃用

/*
解析bmp图片，输入为字节流对象bytearraylist
*/
class AnalyzeBmp
{
public:
    AnalyzeBmp(ByteArrayList *l);
    ~AnalyzeBmp();

public:
    int getMaxBit();            //返回能够插入的最大比特数
    int getMaxByte();           //返回能插入的字节数
    int getType_biBitCount();   //返回图片类型——每个像素的位数 24代表真彩 8代表256色
    int getHeight();
    int getWidth();
    int getDataPtr();
    ByteArrayList * getSourceList();
    BITMAPFILEHEADER getFileHeader();
    BITMAPINFOHEADER getInfoHeader();
    RGBQUAD *getQuad();
    QByteArray * getTargetData();
    bool writeMsg(QString s);
    QString readMsg();
    void setLSBtoZero();    //lsb置零

private:
    ByteArrayList * source;        //数据表
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;
    RGBQUAD *quad;                  //调色板
    int dataPtr;                   //数据域所在的头指针，为list[0]中的指针

private:    //额外参数
    int maxbit; //可插入的最大比特数
    QByteArray * targetData;           //数据表



private:
    void _init();
//    void _readBytes();  //此方法弃用
    void _write(BYTE b);
    BYTE _read();
    void _clean();

};

#endif // ANALYZEBMP_H
